{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# MNIST handwritten digits classification with MLPs\n",
    "\n",
    "In this notebook, we'll train a multi-layer perceptron model to classify MNIST digits using **PyTorch**. \n",
    "\n",
    "First, the needed imports. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "E:\\python\\python.exe\n",
      "3.10.3 (tags/v3.10.3:a342a49, Mar 16 2022, 13:07:40) [MSC v.1929 64 bit (AMD64)]\n",
      "sys.version_info(major=3, minor=10, micro=3, releaselevel='final', serial=0)\n"
     ]
    }
   ],
   "source": [
    "import os, sys\n",
    "print(sys.executable) # works this time\n",
    "print(sys.version)\n",
    "print(sys.version_info)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using PyTorch version: 1.11.0+cu113  Device: cuda\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "from torchvision import datasets, transforms\n",
    "from torch import Tensor\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from MixerMLP.Mixer import MLP_Mixer\n",
    "if torch.cuda.is_available():\n",
    "    device = torch.device('cuda')\n",
    "else:\n",
    "    device = torch.device('cpu')\n",
    "    \n",
    "print('Using PyTorch version:', torch.__version__, ' Device:', device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data\n",
    "\n",
    "Next we'll load the MNIST data.  First time we may have to download the data, which can take a while.\n",
    "\n",
    "Note that we are here using the MNIST test data for *validation*, instead of for testing the final model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\n",
      "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to ./minst\\MNIST\\raw\\train-images-idx3-ubyte.gz\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8efef519668e4b3a91691f6ce4f3232a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/9912422 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./minst\\MNIST\\raw\\train-images-idx3-ubyte.gz to ./minst\\MNIST\\raw\n",
      "\n",
      "Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz\n",
      "Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz to ./minst\\MNIST\\raw\\train-labels-idx1-ubyte.gz\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3f1ecb6a55d244a299aca1e8e31eb4bf",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/28881 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./minst\\MNIST\\raw\\train-labels-idx1-ubyte.gz to ./minst\\MNIST\\raw\n",
      "\n",
      "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz\n",
      "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz to ./minst\\MNIST\\raw\\t10k-images-idx3-ubyte.gz\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a93ea5fcb0344adba1cd1e49223e7598",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/1648877 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./minst\\MNIST\\raw\\t10k-images-idx3-ubyte.gz to ./minst\\MNIST\\raw\n",
      "\n",
      "Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz\n",
      "Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz to ./minst\\MNIST\\raw\\t10k-labels-idx1-ubyte.gz\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "547f5a6658eb4d0a8ffb0fa9fc16717b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/4542 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./minst\\MNIST\\raw\\t10k-labels-idx1-ubyte.gz to ./minst\\MNIST\\raw\n",
      "\n"
     ]
    }
   ],
   "source": [
    "batch_size = 32\n",
    "tf = transforms.Compose([\n",
    "    transforms.Resize((32,32)),\n",
    "    transforms.ToTensor()\n",
    "])\n",
    "\n",
    "\n",
    "train_dataset = datasets.MNIST('./minst', \n",
    "                               train=True, \n",
    "                               download=True, \n",
    "                               transform=tf)\n",
    "\n",
    "validation_dataset = datasets.MNIST('./minst', \n",
    "                                    train=False, \n",
    "                                    download=True,\n",
    "                                    transform=tf)\n",
    "\n",
    "train_loader = torch.utils.data.DataLoader(dataset=train_dataset, \n",
    "                                           batch_size=batch_size, \n",
    "                                           shuffle=True)\n",
    "\n",
    "validation_loader = torch.utils.data.DataLoader(dataset=validation_dataset, \n",
    "                                                batch_size=batch_size, \n",
    "                                                shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The train and test data are provided via data loaders that provide iterators over the datasets. The first element of training data (`X_train`) is a 4th-order tensor of size (`batch_size`, 1, 28, 28), i.e. it consists of a batch of images of size 1x28x28 pixels. `y_train` is a vector containing the correct classes (\"0\", \"1\", ..., \"9\") for each training digit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train: torch.Size([32, 1, 32, 32]) type: torch.FloatTensor\n",
      "y_train: torch.Size([32]) type: torch.LongTensor\n"
     ]
    }
   ],
   "source": [
    "for (X_train, y_train) in train_loader:\n",
    "    print('X_train:', X_train.size(), 'type:', X_train.type())\n",
    "    print('y_train:', y_train.size(), 'type:', y_train.type())\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here are the first 10 training digits:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 2304x72 with 32 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pltsize=1\n",
    "plt.figure(figsize=(32*pltsize, pltsize))\n",
    "\n",
    "for i in range(32):\n",
    "    plt.subplot(1,32,i+1)\n",
    "    plt.axis('off')\n",
    "    plt.imshow(X_train[i,:,:,:].numpy().reshape(32,32), cmap=\"gray_r\")\n",
    "    plt.title('Class: '+str(y_train[i].item()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## MLP network definition\n",
    "\n",
    "Let's define the network as a Python class.  We have to write the `__init__()` and `forward()` methods, and PyTorch will automatically generate a `backward()` method for computing the gradients for the backward pass.\n",
    "\n",
    "Finally, we define an optimizer to update the model parameters based on the computed gradients.  We select *stochastic gradient descent (with momentum)* as the optimization algorithm, and set *learning rate* to 0.01.  Note that there are [several different options](http://pytorch.org/docs/optim.html#algorithms) for the optimizer in PyTorch that we could use instead of *SGD*."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------\n",
      "        Layer (type)               Output Shape         Param #\n",
      "================================================================\n",
      "            Conv2d-1             [-1, 64, 4, 4]           4,160\n",
      "         LayerNorm-2               [-1, 16, 64]             128\n",
      "            Linear-3              [-1, 64, 128]           2,176\n",
      "            Linear-4               [-1, 64, 16]           2,064\n",
      "         MLP_block-5               [-1, 64, 16]               0\n",
      "         LayerNorm-6               [-1, 16, 64]             128\n",
      "            Linear-7              [-1, 16, 512]          33,280\n",
      "            Linear-8               [-1, 16, 64]          32,832\n",
      "         MLP_block-9               [-1, 16, 64]               0\n",
      "      Mixer_layer-10               [-1, 16, 64]               0\n",
      "        LayerNorm-11               [-1, 16, 64]             128\n",
      "           Linear-12              [-1, 64, 128]           2,176\n",
      "           Linear-13               [-1, 64, 16]           2,064\n",
      "        MLP_block-14               [-1, 64, 16]               0\n",
      "        LayerNorm-15               [-1, 16, 64]             128\n",
      "           Linear-16              [-1, 16, 512]          33,280\n",
      "           Linear-17               [-1, 16, 64]          32,832\n",
      "        MLP_block-18               [-1, 16, 64]               0\n",
      "      Mixer_layer-19               [-1, 16, 64]               0\n",
      "        LayerNorm-20               [-1, 16, 64]             128\n",
      "           Linear-21              [-1, 64, 128]           2,176\n",
      "           Linear-22               [-1, 64, 16]           2,064\n",
      "        MLP_block-23               [-1, 64, 16]               0\n",
      "        LayerNorm-24               [-1, 16, 64]             128\n",
      "           Linear-25              [-1, 16, 512]          33,280\n",
      "           Linear-26               [-1, 16, 64]          32,832\n",
      "        MLP_block-27               [-1, 16, 64]               0\n",
      "      Mixer_layer-28               [-1, 16, 64]               0\n",
      "        LayerNorm-29               [-1, 16, 64]             128\n",
      "           Linear-30              [-1, 64, 128]           2,176\n",
      "           Linear-31               [-1, 64, 16]           2,064\n",
      "        MLP_block-32               [-1, 64, 16]               0\n",
      "        LayerNorm-33               [-1, 16, 64]             128\n",
      "           Linear-34              [-1, 16, 512]          33,280\n",
      "           Linear-35               [-1, 16, 64]          32,832\n",
      "        MLP_block-36               [-1, 16, 64]               0\n",
      "      Mixer_layer-37               [-1, 16, 64]               0\n",
      "        LayerNorm-38               [-1, 16, 64]             128\n",
      "           Linear-39              [-1, 64, 128]           2,176\n",
      "           Linear-40               [-1, 64, 16]           2,064\n",
      "        MLP_block-41               [-1, 64, 16]               0\n",
      "        LayerNorm-42               [-1, 16, 64]             128\n",
      "           Linear-43              [-1, 16, 512]          33,280\n",
      "           Linear-44               [-1, 16, 64]          32,832\n",
      "        MLP_block-45               [-1, 16, 64]               0\n",
      "      Mixer_layer-46               [-1, 16, 64]               0\n",
      "        LayerNorm-47               [-1, 16, 64]             128\n",
      "           Linear-48              [-1, 64, 128]           2,176\n",
      "           Linear-49               [-1, 64, 16]           2,064\n",
      "        MLP_block-50               [-1, 64, 16]               0\n",
      "        LayerNorm-51               [-1, 16, 64]             128\n",
      "           Linear-52              [-1, 16, 512]          33,280\n",
      "           Linear-53               [-1, 16, 64]          32,832\n",
      "        MLP_block-54               [-1, 16, 64]               0\n",
      "      Mixer_layer-55               [-1, 16, 64]               0\n",
      "        LayerNorm-56               [-1, 16, 64]             128\n",
      "           Linear-57              [-1, 64, 128]           2,176\n",
      "           Linear-58               [-1, 64, 16]           2,064\n",
      "        MLP_block-59               [-1, 64, 16]               0\n",
      "        LayerNorm-60               [-1, 16, 64]             128\n",
      "           Linear-61              [-1, 16, 512]          33,280\n",
      "           Linear-62               [-1, 16, 64]          32,832\n",
      "        MLP_block-63               [-1, 16, 64]               0\n",
      "      Mixer_layer-64               [-1, 16, 64]               0\n",
      "        LayerNorm-65               [-1, 16, 64]             128\n",
      "           Linear-66              [-1, 64, 128]           2,176\n",
      "           Linear-67               [-1, 64, 16]           2,064\n",
      "        MLP_block-68               [-1, 64, 16]               0\n",
      "        LayerNorm-69               [-1, 16, 64]             128\n",
      "           Linear-70              [-1, 16, 512]          33,280\n",
      "           Linear-71               [-1, 16, 64]          32,832\n",
      "        MLP_block-72               [-1, 16, 64]               0\n",
      "      Mixer_layer-73               [-1, 16, 64]               0\n",
      "           Linear-74                   [-1, 10]             650\n",
      "================================================================\n",
      "Total params: 569,674\n",
      "Trainable params: 569,674\n",
      "Non-trainable params: 0\n",
      "----------------------------------------------------------------\n",
      "Input size (MB): 0.00\n",
      "Forward/backward pass size (MB): 1.45\n",
      "Params size (MB): 2.17\n",
      "Estimated Total Size (MB): 3.62\n",
      "----------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "BTACH_SIZE = 32\n",
    "IMG_CHANNEL_NUM = 1\n",
    "IMG_SHAPE = (32, 32)\n",
    "PATCH_SHAPE = (8, 8)\n",
    "HIDDEN_CHANNEL_NUM = 64\n",
    "MIXER_LAYER_NUM = 8\n",
    "DS = 128\n",
    "DC = 512\n",
    "OUTPUT_CLASS_NUM = 10\n",
    "mlp_mixer = MLP_Mixer(IMG_SHAPE, IMG_CHANNEL_NUM,PATCH_SHAPE, HIDDEN_CHANNEL_NUM, MIXER_LAYER_NUM, DS, DC, OUTPUT_CLASS_NUM)\n",
    "\n",
    "\n",
    "model = mlp_mixer.to(device)\n",
    "optimizer = torch.optim.Adam(model.parameters(),1e-2)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "from torchsummary import summary\n",
    "summary(mlp_mixer,input_size=(1,32,32),device='cuda')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Learning\n",
    "\n",
    "Let's now define functions to `train()` and `validate()` the model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(epoch, log_interval=200):\n",
    "    # Set model to training mode\n",
    "    model.train()\n",
    "    \n",
    "    # Loop over each batch from the training set\n",
    "    for batch_idx, (data, target) in enumerate(train_loader):\n",
    "        # Copy data to GPU if needed\n",
    "        data = data.to(device)\n",
    "        target = target.to(device)\n",
    "\n",
    "        # Zero gradient buffers\n",
    "        optimizer.zero_grad() \n",
    "        \n",
    "        # Pass data through the network\n",
    "        output = model(data)\n",
    "\n",
    "        # Calculate loss\n",
    "        loss = criterion(output, target)\n",
    "\n",
    "        # Backpropagate\n",
    "        loss.backward()\n",
    "        \n",
    "        # Update weights\n",
    "        optimizer.step()\n",
    "        \n",
    "        if batch_idx % log_interval == 0:\n",
    "            print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n",
    "                epoch, batch_idx * len(data), len(train_loader.dataset),\n",
    "                100. * batch_idx / len(train_loader), loss.data.item()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "def validate(loss_vector, accuracy_vector):\n",
    "    model.eval()\n",
    "    val_loss, correct = 0, 0\n",
    "    for data, target in validation_loader:\n",
    "        data = data.to(device)\n",
    "        target = target.to(device)\n",
    "        output = model(data)\n",
    "        val_loss += criterion(output, target).data.item()\n",
    "        pred = output.data.max(1)[1] # get the index of the max log-probability\n",
    "        correct += pred.eq(target.data).cpu().sum()\n",
    "\n",
    "    val_loss /= len(validation_loader)\n",
    "    loss_vector.append(val_loss)\n",
    "\n",
    "    accuracy = 100. * correct.to(torch.float32) / len(validation_loader.dataset)\n",
    "    accuracy_vector.append(accuracy)\n",
    "    \n",
    "    print('\\nValidation set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n",
    "        val_loss, correct, len(validation_loader.dataset), accuracy))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we are ready to train our model using the `train()` function.  An *epoch* means one pass through the whole training data. After each epoch, we evaluate the model using `validate()`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Epoch: 1 [0/60000 (0%)]\tLoss: 2.316620\n",
      "Train Epoch: 1 [6400/60000 (11%)]\tLoss: 0.860218\n",
      "Train Epoch: 1 [12800/60000 (21%)]\tLoss: 0.625719\n",
      "Train Epoch: 1 [19200/60000 (32%)]\tLoss: 0.492960\n",
      "Train Epoch: 1 [25600/60000 (43%)]\tLoss: 0.518405\n",
      "Train Epoch: 1 [32000/60000 (53%)]\tLoss: 0.098589\n",
      "Train Epoch: 1 [38400/60000 (64%)]\tLoss: 0.025043\n",
      "Train Epoch: 1 [44800/60000 (75%)]\tLoss: 0.078084\n",
      "Train Epoch: 1 [51200/60000 (85%)]\tLoss: 0.299179\n",
      "Train Epoch: 1 [57600/60000 (96%)]\tLoss: 0.031415\n",
      "\n",
      "Validation set: Average loss: 0.2616, Accuracy: 9226/10000 (92%)\n",
      "\n",
      "Train Epoch: 2 [0/60000 (0%)]\tLoss: 0.131156\n",
      "Train Epoch: 2 [6400/60000 (11%)]\tLoss: 0.184480\n",
      "Train Epoch: 2 [12800/60000 (21%)]\tLoss: 0.653831\n",
      "Train Epoch: 2 [19200/60000 (32%)]\tLoss: 0.130678\n",
      "Train Epoch: 2 [25600/60000 (43%)]\tLoss: 0.237412\n",
      "Train Epoch: 2 [32000/60000 (53%)]\tLoss: 0.047344\n",
      "Train Epoch: 2 [38400/60000 (64%)]\tLoss: 0.271553\n",
      "Train Epoch: 2 [44800/60000 (75%)]\tLoss: 0.145963\n",
      "Train Epoch: 2 [51200/60000 (85%)]\tLoss: 0.147974\n",
      "Train Epoch: 2 [57600/60000 (96%)]\tLoss: 0.064499\n",
      "\n",
      "Validation set: Average loss: 0.2900, Accuracy: 9268/10000 (93%)\n",
      "\n",
      "Train Epoch: 3 [0/60000 (0%)]\tLoss: 0.128687\n",
      "Train Epoch: 3 [6400/60000 (11%)]\tLoss: 0.292019\n",
      "Train Epoch: 3 [12800/60000 (21%)]\tLoss: 0.161845\n",
      "Train Epoch: 3 [19200/60000 (32%)]\tLoss: 0.366046\n",
      "Train Epoch: 3 [25600/60000 (43%)]\tLoss: 0.137790\n",
      "Train Epoch: 3 [32000/60000 (53%)]\tLoss: 0.168721\n",
      "Train Epoch: 3 [38400/60000 (64%)]\tLoss: 0.507295\n",
      "Train Epoch: 3 [44800/60000 (75%)]\tLoss: 0.016064\n",
      "Train Epoch: 3 [51200/60000 (85%)]\tLoss: 0.016895\n",
      "Train Epoch: 3 [57600/60000 (96%)]\tLoss: 0.016205\n",
      "\n",
      "Validation set: Average loss: 0.2426, Accuracy: 9419/10000 (94%)\n",
      "\n",
      "Train Epoch: 4 [0/60000 (0%)]\tLoss: 0.351771\n",
      "Train Epoch: 4 [6400/60000 (11%)]\tLoss: 0.044877\n",
      "Train Epoch: 4 [12800/60000 (21%)]\tLoss: 0.341520\n",
      "Train Epoch: 4 [19200/60000 (32%)]\tLoss: 0.058948\n",
      "Train Epoch: 4 [25600/60000 (43%)]\tLoss: 0.072452\n",
      "Train Epoch: 4 [32000/60000 (53%)]\tLoss: 0.238967\n",
      "Train Epoch: 4 [38400/60000 (64%)]\tLoss: 0.687161\n",
      "Train Epoch: 4 [44800/60000 (75%)]\tLoss: 0.208673\n",
      "Train Epoch: 4 [51200/60000 (85%)]\tLoss: 0.018857\n",
      "Train Epoch: 4 [57600/60000 (96%)]\tLoss: 0.045970\n",
      "\n",
      "Validation set: Average loss: 0.1083, Accuracy: 9706/10000 (97%)\n",
      "\n",
      "Train Epoch: 5 [0/60000 (0%)]\tLoss: 0.004924\n",
      "Train Epoch: 5 [6400/60000 (11%)]\tLoss: 0.632976\n",
      "Train Epoch: 5 [12800/60000 (21%)]\tLoss: 0.001234\n",
      "Train Epoch: 5 [19200/60000 (32%)]\tLoss: 0.004318\n",
      "Train Epoch: 5 [25600/60000 (43%)]\tLoss: 0.246881\n",
      "Train Epoch: 5 [32000/60000 (53%)]\tLoss: 0.661396\n",
      "Train Epoch: 5 [38400/60000 (64%)]\tLoss: 0.009008\n",
      "Train Epoch: 5 [44800/60000 (75%)]\tLoss: 0.037719\n",
      "Train Epoch: 5 [51200/60000 (85%)]\tLoss: 0.193550\n",
      "Train Epoch: 5 [57600/60000 (96%)]\tLoss: 0.020135\n",
      "\n",
      "Validation set: Average loss: 0.1416, Accuracy: 9682/10000 (97%)\n",
      "\n",
      "Train Epoch: 6 [0/60000 (0%)]\tLoss: 0.409341\n",
      "Train Epoch: 6 [6400/60000 (11%)]\tLoss: 0.003741\n",
      "Train Epoch: 6 [12800/60000 (21%)]\tLoss: 0.085886\n",
      "Train Epoch: 6 [19200/60000 (32%)]\tLoss: 0.381773\n",
      "Train Epoch: 6 [25600/60000 (43%)]\tLoss: 0.011084\n",
      "Train Epoch: 6 [32000/60000 (53%)]\tLoss: 0.049638\n",
      "Train Epoch: 6 [38400/60000 (64%)]\tLoss: 0.349742\n",
      "Train Epoch: 6 [44800/60000 (75%)]\tLoss: 0.163566\n",
      "Train Epoch: 6 [51200/60000 (85%)]\tLoss: 0.517592\n",
      "Train Epoch: 6 [57600/60000 (96%)]\tLoss: 0.006068\n",
      "\n",
      "Validation set: Average loss: 0.1455, Accuracy: 9666/10000 (97%)\n",
      "\n",
      "Train Epoch: 7 [0/60000 (0%)]\tLoss: 0.362134\n",
      "Train Epoch: 7 [6400/60000 (11%)]\tLoss: 0.429986\n",
      "Train Epoch: 7 [12800/60000 (21%)]\tLoss: 0.029136\n",
      "Train Epoch: 7 [19200/60000 (32%)]\tLoss: 0.059504\n",
      "Train Epoch: 7 [25600/60000 (43%)]\tLoss: 0.067833\n",
      "Train Epoch: 7 [32000/60000 (53%)]\tLoss: 0.483638\n",
      "Train Epoch: 7 [38400/60000 (64%)]\tLoss: 0.023893\n",
      "Train Epoch: 7 [44800/60000 (75%)]\tLoss: 0.053320\n",
      "Train Epoch: 7 [51200/60000 (85%)]\tLoss: 0.211735\n",
      "Train Epoch: 7 [57600/60000 (96%)]\tLoss: 0.454588\n",
      "\n",
      "Validation set: Average loss: 0.1853, Accuracy: 9613/10000 (96%)\n",
      "\n",
      "Train Epoch: 8 [0/60000 (0%)]\tLoss: 0.009268\n",
      "Train Epoch: 8 [6400/60000 (11%)]\tLoss: 0.460178\n",
      "Train Epoch: 8 [12800/60000 (21%)]\tLoss: 0.149990\n",
      "Train Epoch: 8 [19200/60000 (32%)]\tLoss: 0.557251\n",
      "Train Epoch: 8 [25600/60000 (43%)]\tLoss: 0.229830\n",
      "Train Epoch: 8 [32000/60000 (53%)]\tLoss: 0.240290\n",
      "Train Epoch: 8 [38400/60000 (64%)]\tLoss: 0.435995\n",
      "Train Epoch: 8 [44800/60000 (75%)]\tLoss: 0.477984\n",
      "Train Epoch: 8 [51200/60000 (85%)]\tLoss: 0.135785\n",
      "Train Epoch: 8 [57600/60000 (96%)]\tLoss: 0.067328\n",
      "\n",
      "Validation set: Average loss: 0.1360, Accuracy: 9701/10000 (97%)\n",
      "\n",
      "Train Epoch: 9 [0/60000 (0%)]\tLoss: 0.000056\n",
      "Train Epoch: 9 [6400/60000 (11%)]\tLoss: 0.011558\n",
      "Train Epoch: 9 [12800/60000 (21%)]\tLoss: 0.359303\n",
      "Train Epoch: 9 [19200/60000 (32%)]\tLoss: 0.010043\n",
      "Train Epoch: 9 [25600/60000 (43%)]\tLoss: 0.004151\n",
      "Train Epoch: 9 [32000/60000 (53%)]\tLoss: 0.241323\n",
      "Train Epoch: 9 [38400/60000 (64%)]\tLoss: 0.084685\n",
      "Train Epoch: 9 [44800/60000 (75%)]\tLoss: 0.201288\n",
      "Train Epoch: 9 [51200/60000 (85%)]\tLoss: 0.511271\n",
      "Train Epoch: 9 [57600/60000 (96%)]\tLoss: 0.298671\n",
      "\n",
      "Validation set: Average loss: 0.1640, Accuracy: 9697/10000 (97%)\n",
      "\n",
      "Train Epoch: 10 [0/60000 (0%)]\tLoss: 0.153823\n",
      "Train Epoch: 10 [6400/60000 (11%)]\tLoss: 0.237857\n",
      "Train Epoch: 10 [12800/60000 (21%)]\tLoss: 0.000124\n",
      "Train Epoch: 10 [19200/60000 (32%)]\tLoss: 0.454542\n",
      "Train Epoch: 10 [25600/60000 (43%)]\tLoss: 0.002906\n",
      "Train Epoch: 10 [32000/60000 (53%)]\tLoss: 0.017229\n",
      "Train Epoch: 10 [38400/60000 (64%)]\tLoss: 0.009700\n",
      "Train Epoch: 10 [44800/60000 (75%)]\tLoss: 0.125495\n",
      "Train Epoch: 10 [51200/60000 (85%)]\tLoss: 0.551258\n",
      "Train Epoch: 10 [57600/60000 (96%)]\tLoss: 0.079316\n",
      "\n",
      "Validation set: Average loss: 0.1565, Accuracy: 9658/10000 (97%)\n",
      "\n",
      "CPU times: total: 8min 47s\n",
      "Wall time: 8min 33s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "epochs = 10\n",
    "\n",
    "lossv, accv = [], []\n",
    "for epoch in range(1, epochs + 1):\n",
    "    train(epoch)\n",
    "    validate(lossv, accv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's now visualize how the training progressed. \n",
    "\n",
    "* *Loss* is a function of the difference of the network output and the target values.  We are minimizing the loss function during training so it should decrease over time.\n",
    "* *Accuracy* is the classification accuracy for the test data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(5,3))\n",
    "plt.plot(np.arange(1,epochs+1), lossv)\n",
    "plt.title('validation loss')\n",
    "\n",
    "plt.figure(figsize=(5,3))\n",
    "plt.plot(np.arange(1,epochs+1), accv)\n",
    "plt.title('validation accuracy');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model tuning\n",
    "\n",
    "Modify the MLP model.  Try to improve the classification accuracy, or experiment with the effects of different parameters.  If you are interested in the state-of-the-art performance on permutation invariant MNIST, see e.g. this [recent paper](https://arxiv.org/abs/1507.02672) by Aalto University / The Curious AI Company researchers.\n",
    "\n",
    "You can also consult the PyTorch documentation at http://pytorch.org/."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
